# 实验二：
# 对一张图像进行缩放，观察其分辨率，降低灰度分辨率两种模式，观察图像变化；
# 步骤：1：对一张图像进行缩放，观察其分辨率和图像变化
#      2：降低灰度分辨率，观察其分辨率和图像变化

# 图像分辨率：
# 指图像中存储的信息量，是每英寸图像内有多少个像素点，分辨率的单位为PPI(Pixels Per Inch)，通常叫做像素每英寸。
# 对于计算机的显示系统来说，一幅图像的PPI值是没有意义的，起作用的是这幅图像所包含的总的像素数，
# 也就是另一种分辨率表示方法：水平方向的像素数×垂直方向的的像素数。
# 灰度分辨率：
# 在数字图像处理教程中，灰度分辨率指的是色阶，
# 色阶是表示图像亮度强弱的指数标准，也就是我们说的色彩指数。
# 灰度分辨率指亮度，和颜色无关，但最亮的只有白色，最不亮的只有黑色。

# cv2.resize()：
# 其第一个参数为待缩放的图像，
# 第二个参数为缩放后的图像尺寸大小，如(640,480)
# 第三个和第四个参数为缩放尺度因子，
# 第五个参数为缩放的插值方法。
# 插值方法： 默认时使用的是cv2.INTER_LINEAR缩小时推荐使用cv2.INTER_AREA
# 扩展放大时推荐使用cv2.INTER_CUBIC 和 cv2.INTER_LINEAR，前者比后者运行速度慢。

import cv2

img = cv2.imread('img/lena.png')

# 第一种缩放方法，用resize(),在第二个参数给定尺寸大小。这里长和宽放大两倍
height, width = img.shape[:2]
# img.shape=(512,512,3) 数组分别代表的是图像的高、宽、通道，上面这句将前两个数值赋给了height和width下面要用到
print("原图分辨率：", height, "*", width)
enlarge = cv2.resize(img, (2 * width, 2 * height))
print("缩放：放大后：", enlarge.shape[:2])

# 上一句默认插值方法参数为cv2.INTER_LINEAR 这句也可以：
# enlarge = cv2.resize(img, (2 * width, 2 * height), interpolation=cv2.INTER_CUBIC)

# 第二种缩放方法，用resize(),在第三、四参数给定缩放比例。这里长和宽缩小到0.5倍。好处是不用读取长宽了
# enlarge = cv2.resize(img, None, fx=1.5, fy=1.5, interpolation=cv2.INTER_CUBIC)
shrink = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)
print("缩放：缩小后：", shrink.shape[:2])

# None是输出图像的尺寸大小，fx和fy是缩放因子
# cv2.INTER_CUBIC 是插值方法，一般默认为cv2.INTER_LINEAR
cv2.imshow('enlarge', enlarge)
cv2.imshow('shrink', shrink)
cv2.imshow('img', img)
cv2.waitKey(0)


# 下面函数先量化到level+1级，再量化至256级以显示
def reduce_intensity_levels(img, level):
    img = cv2.copyTo(img, None)
    for x in range(img.shape[0]):
        for y in range(img.shape[1]):
            si = img[x, y]
            ni = int(level * si / 255 + 0.5) * (255 / level)
            img[x, y] = ni
    return img


src = cv2.imread('img/lena.png')

# cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

# 量化到8级
result8 = reduce_intensity_levels(gray, 7)
# 量化到2级
result2 = reduce_intensity_levels(gray, 1)

cv2.imshow('src', src)
cv2.imshow('gray', gray)
cv2.imshow('result8', result8)
cv2.imshow('result2', result2)
cv2.waitKey(0)
